package pe.com.hermes.hermetic.web.controller.configuracion;

import pe.com.hermes.hermetic.beans.AuditBean;
import pe.com.hermes.hermetic.beans.ClienteBean;
import pe.com.hermes.hermetic.beans.ConfBean;
import pe.com.hermes.hermetic.beans.ConfigArchIndicadoresBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.negocio.service.TablService;
import pe.com.hermes.hermetic.negocio.ultil.Util;
import pe.com.hermes.hermetic.web.controller.base.IController;
import pe.com.hermes.hermetic.web.controller.base.IWebOpciones;
import pe.com.hermes.hermetic.web.forms.ConfForm;

import pe.com.hermes.hermetic.web.forms.HMF1007Form;

import pe.com.hermes.hermetic.web.forms.SelecPuntoForm;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

@Controller
@RequestMapping("/mostrarHWF1007.html")
@SessionAttributes(value={"form","codOpci","desOpci"})
public class ConfigArchIndicadoresController implements IController {
   
    protected final static Logger logger = Logger.getLogger(ConfigurarParametrosController.class);
    @Autowired
    private HermeticFacade servicioHermetic;
    @Autowired
    private TablService tablService;
    
    @RequestMapping(method={RequestMethod.GET})    
    protected String showForm(ModelMap model,HttpServletRequest request)throws Exception{
        logger.info(this.getClass().toString()+" "+"metodo: GET");
        HMF1007Form form = new HMF1007Form();
 
        model.put(FORM_KEY,form);
        AuditBean auditBean = new AuditBean(CONF_ARCH_IND_SERV);
        servicioHermetic.inseAudit(auditBean);
        String codOpci = IWebOpciones.CONF_ARCH_IND_SERV;
        String desOpci = servicioHermetic.getDesOpci(codOpci, request);
        model.put("codOpci",codOpci);
        model.put("desOpci",desOpci);
        return FORM_CNFG_ARCH_IND;
    }
    
    @RequestMapping(params={"accion=mostrarClientes","cliente","estado"})  
    protected String mostrarClientes(@RequestParam("cliente") String descCliente,@RequestParam("estado") String estado,ModelMap model,@ModelAttribute(FORM_KEY) HMF1007Form form,BindingResult result,HttpServletRequest request){
        
        List listaConfigArchInd=new ArrayList();
        //Obtener la lista
        try{
            listaConfigArchInd=servicioHermetic.getListConfigArchIndi(descCliente,estado);
        }
        catch(Exception ex){
            ex.printStackTrace();
            logger.error("Error al mostrar cliente en HMF1007",ex);
        }
        model.put("listaConfigArchInd",listaConfigArchInd);
        model.put(FORM_KEY,form);
        return FORM_CNFG_ARCH_IND;
    }
    
    @RequestMapping(params={"accion=mostrarEditarReportes","cliente"})
    protected String showFormPopUp(@RequestParam("cliente")String codCliente,ModelMap model,HttpServletRequest request)throws Exception{
        logger.info(this.getClass().toString()+" "+"metodo: GET");
        HMF1007Form form = new HMF1007Form();
        form.setCliente(codCliente);
        List listaTipoArchInd=new ArrayList(); 
        
        //Obtener la lista de Reportes por Cliente
        listaTipoArchInd=servicioHermetic.getListTipoArchXClie(codCliente,"");
        form.setListTipoArchOriginal(listaTipoArchInd);
        
        //Crear la lista de Tipos de Archivos inicialmente marcados
        List listTipoArchMarcados=new ArrayList();
        for (int i=0;i<listaTipoArchInd.size();i++){
            ConfigArchIndicadoresBean bean=(ConfigArchIndicadoresBean) listaTipoArchInd.get(i);
            if ("1".equals(bean.getEstado())){
                listTipoArchMarcados.add(bean.getCodReporte());
            }
        form.setListReportes(listTipoArchMarcados);
        }
        
        model.put("listaTipoArchInd",listaTipoArchInd);
        model.put(FORM_KEY,form);

        return FORM_CNFG_ARCH_IND_POPUP;
    }
    
    @RequestMapping(params={"accion=mostrarTiposArchivo","desTipoArchivo"})  
    protected String mostrarTiposArchivo(@RequestParam("desTipoArchivo") String tipoArchivo,ModelMap model,@ModelAttribute(FORM_KEY) HMF1007Form form,BindingResult result,HttpServletRequest request){
        
        List listaTipoArchInd=new ArrayList();
        String codCliente=form.getCliente();
        //Obtener la lista
        try{
            listaTipoArchInd=servicioHermetic.getListTipoArchXClie(codCliente,tipoArchivo);
        }
        catch(Exception ex){
            ex.printStackTrace();
            logger.error("Error al mostrar cliente en HMF1007",ex);
        }
        
        model.put("listaTipoArchInd",listaTipoArchInd);
        model.put(FORM_KEY,form);
        return FORM_CNFG_ARCH_IND_POPUP;
    }
    
    @RequestMapping(params={"accion=selectTipoArch","codReporte"}) 
    protected  String selectTipoArch(@RequestParam("codReporte") String codReporte,ModelMap model,@ModelAttribute(FORM_KEY) HMF1007Form form,HttpServletRequest request)throws Exception{        
        logger.info(this.getClass().toString()+" "+"metodo: selectTipoArch");        
        List listaReportes=form.getListReportes();
        if (listaReportes==null) listaReportes=new ArrayList();
        if(("").equals(codReporte))
            return FORM_CNFG_ARCH_IND_POPUP;
        boolean existe=false;
        for(int i=0;i<listaReportes.size();i++){                
                if(listaReportes.get(i)!=null&&listaReportes.get(i).equals(codReporte)){
                    existe=true;
                }
        }
        if (!existe)
            listaReportes.add(codReporte);
        
        form.setListReportes(listaReportes);    
        model.put(FORM_KEY,form);        
        return FORM_CNFG_ARCH_IND_POPUP;
    }
    
    @RequestMapping(params={"accion=deselectTipoArch","codReporte"}) 
    protected String deselectTipoArch(@RequestParam("codReporte") String codReporte,ModelMap model,@ModelAttribute(FORM_KEY) HMF1007Form form,HttpServletRequest request)throws Exception{        
        logger.info(this.getClass().toString()+" "+"metodo: deselectTipoArch");        
        List listaReportes=form.getListReportes();
        if (listaReportes==null) listaReportes=new ArrayList();
        if(("").equals(codReporte))
            return FORM_CNFG_ARCH_IND_POPUP;
        boolean existe=false;
        for(int i=0;i<listaReportes.size();i++){                
                if(listaReportes.get(i)!=null&&listaReportes.get(i).equals(codReporte)){
                    listaReportes.remove(i);
                }
        }
        
        form.setListReportes(listaReportes);    
        model.put(FORM_KEY,form);        
        return FORM_CNFG_ARCH_IND_POPUP;
    }        
    
    @RequestMapping(params={"accion=selectTodos","codTodos"}) 
    protected String selectTodos(@RequestParam("codTodos") boolean codTodos ,ModelMap model,@ModelAttribute(FORM_KEY) HMF1007Form form,HttpServletRequest request)throws Exception{
        logger.info(this.getClass().toString()+" "+"metodo: GET");
        
        //Asigno el check a todos los elenmentos de la lista Cuenta        
        List original=form.getListTipoArchOriginal();
        List listaTodos=new ArrayList();
        List actualizada=new ArrayList();
        for (int i=0;i<original.size();i++){
            ConfigArchIndicadoresBean a=new ConfigArchIndicadoresBean();
            ConfigArchIndicadoresBean b=(ConfigArchIndicadoresBean) original.get(i);
            a.setDesReporte(b.getDesReporte());
            a.setCodReporte(b.getCodReporte());
            if (codTodos){
                a.setEstado("1");
                actualizada.add(b.getCodReporte());
            }
            else{
                a.setEstado("0");
            }
            listaTodos.add(a);
        }
        
        form.setListReportes(actualizada);
        model.put("listaTipoArchInd",listaTodos);
        model.put(FORM_KEY,form);
        return FORM_CNFG_ARCH_IND_POPUP;
    }
    
    @RequestMapping(params={"accion=guardarSelecTiposArch"}) 
    protected String guardarSelecTiposArch(ModelMap model,@ModelAttribute(FORM_KEY) HMF1007Form form,HttpServletRequest request){
        logger.info(this.getClass().toString()+" "+"metodo: guardar Tipos de Archivos");
               
        List listActualizada = form.getListReportes(); 
        List listOriginal =form.getListTipoArchOriginal();
        
        List listActivarInsert=new ArrayList();
        List listActivarUpdate=new ArrayList();
        List listDesactivar=new ArrayList();
        try{
            for (int i=0;i<listOriginal.size();i++){
                ConfigArchIndicadoresBean bean=(ConfigArchIndicadoresBean)listOriginal.get(i);
                for (int j=0;j<listActualizada.size();j++){
                        if (bean!=null && bean.getCodReporte()!=null 
                            && bean.getCodReporte().equals(listActualizada.get(j))){
                            if ("0".equals(bean.getEstado())){
                                if ("0".equals(bean.getRealRow())){
                                    listActivarInsert.add(bean);
                                }
                                if ("1".equals(bean.getRealRow())){
                                    listActivarUpdate.add(bean);   
                                }
                            }
                            listOriginal.remove(i--);
                            break;
                        }
                }
            }
            //Los que sobraron son los que se han desactivado
            for (int i=0;i<listOriginal.size();i++){
                listDesactivar.add(listOriginal.get(i));
            }
            ConfigArchIndicadoresBean bean;
            for (int i=0;i<listActivarInsert.size();i++){
                bean=(ConfigArchIndicadoresBean)listActivarInsert.get(i);
                servicioHermetic.updateTipoArchXCliente(bean.getCodReporte(),bean.getCodCliente(),"1","0");
            }
            for (int j=0;j<listActivarUpdate.size();j++){
                bean=(ConfigArchIndicadoresBean)listActivarUpdate.get(j);
                servicioHermetic.updateTipoArchXCliente(bean.getCodReporte(),bean.getCodCliente(),"1","1");
            }
            for (int k=0;k<listDesactivar.size();k++){
                bean=(ConfigArchIndicadoresBean)listDesactivar.get(k);
                servicioHermetic.updateTipoArchXCliente(bean.getCodReporte(),bean.getCodCliente(),"0","1");
            }
        }
        catch(Exception ex){
            ex.printStackTrace();
            logger.error("Error al grabar Tipos de Arch indicadores",ex);
        }
        return FORM_CNFG_ARCH_IND_POPUP;
        
    }
    
    @RequestMapping(params={"accion=searchDesCliente"}) 
    protected @ResponseBody String[] searchDesCliente(HttpServletRequest request)throws Exception{        
        logger.info(this.getClass().toString()+" "+"metodo: searchDesCliente");        
        List listClientesBanco = servicioHermetic.getListClienteXTipo("1","");
        String[] arrayClientes = new String[listClientesBanco.size()];
        for(int i=0;i<listClientesBanco.size();i++){
            arrayClientes[i] = ((ClienteBean)listClientesBanco.get(i)).getNombre();
        }
        return arrayClientes;
    }
    
   
}
